linux 中的锁
linux 中的锁分为四种类型,分别是用在 临界区、CPU、内存、Cache 中,
atomic(原子变量)与 spinlock(自旋锁)
- atomic 原子变量在 x86 多核竞争数据时,提供 Lock 指令进行锁总线操作,保证“读 - 修改 - 写”的操作在芯片上的原子性
- spinlock 自旋锁将当前线程不停的执行循环体,而不改变线程的运行状态,在 CPU 上实现忙等,以此保证相应最快
- 设计初衷:短时间内进行轻量级的锁定。
semaphore(信号量)与 mutex(互斥锁)
- semaphore 信号量专用保护有限数量的临界资源,信号量在获取和释放时,通过自旋锁保护,当有中断时会把中断保存到 efags 寄存器,最后在恢复中断
- mutex 互斥锁目的控制同一时刻只有一个线程进入临界区,让无法进入临界的线程休眠
rw-lock 与 preempt
- rw-lock 将读操作和写操作分开并加锁操作,减小加锁粒度,优化读大于写的场景
- preempt 抢占时间片用完后调用 schedule 函数进行调度;由于 IO 等原因自己主动调用 schedule 函数
pree-CPU
- 解决 CPU 各自使用 L2 cache 数据与内存中的不一致问题
RCU 与 Memory Barrier
- RCU 机制(Read Copy Update):解决多个 CPU 同时读写共享数据的场景
- 内存屏障:在程序运行的过程中,对内存访问的不一定按照代码编写的顺序执行。编译器对代码进行优化,多处理器中存在指令乱序访问内存的可能。